package com.system.ad.index.adunit;

import com.system.ad.index.adplan.AdPlanVo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 广告单元视图对象，用于传输广告单元信息。
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdUnitVo {

    /** 广告单元ID */
    private Long unitId;

    /** 广告单元状态 */
    private Integer unitStatus;

    /** 广告位置类型 */
    private Integer positionType;

    /** 计划ID */
    private Long planId;

    private AdPlanVo adPlanVo;

    /**
     * 更新广告单元信息。
     * @param adUnitVo 新的广告单元信息
     */
    void update(AdUnitVo adUnitVo) {
        if (adUnitVo.getUnitId() != null) {
            this.unitId = adUnitVo.unitId;
        }
        if (adUnitVo.getUnitStatus() != null) {
            this.unitStatus = adUnitVo.unitStatus;
        }
        if (adUnitVo.getPositionType() != null) {
            this.positionType = adUnitVo.positionType;
        }
        if (adUnitVo.getPlanId() != null) {
            this.planId = adUnitVo.planId;
        }
    }

    /**
     * 检查广告位置类型是否为开屏广告。
     * @param positionType 广告位置类型
     * @return 是否为开屏广告
     */
    private static boolean isKaiPing(int positionType) {
        return (positionType & AdUnitConstants.POSITION_TYPE.KAIPING) > 0;
    }

    /**
     * 检查广告位置类型是否为贴片广告。
     * @param positionType 广告位置类型
     * @return 是否为贴片广告
     */
    private static boolean isTiePian(int positionType) {
        return (positionType & AdUnitConstants.POSITION_TYPE.TIEPIAN) > 0;
    }

    /**
     * 检查广告位置类型是否为贴片中部广告。
     * @param positionType 广告位置类型
     * @return 是否为贴片中部广告
     */
    private static boolean isTiePianMiddle(int positionType) {
        return (positionType & AdUnitConstants.POSITION_TYPE.TIEPIAN_MIDDLE) > 0;
    }

    /**
     * 检查广告位置类型是否为贴片暂停广告。
     * @param positionType 广告位置类型
     * @return 是否为贴片暂停广告
     */
    private static boolean isTiePianPause(int positionType) {
        return (positionType & AdUnitConstants.POSITION_TYPE.TIEPIAN_PAUSE) > 0;
    }

    /**
     * 检查广告位置类型是否为贴片后部广告。
     * @param positionType 广告位置类型
     * @return 是否为贴片后部广告
     */
    private static boolean isTiePianPost(int positionType) {
        return (positionType & AdUnitConstants.POSITION_TYPE.TIEPIAN_POST) > 0;
    }

    /**
     * 检查广告位类型是否符合要求。
     * @param adSlotType 广告位类型
     * @param positionType 广告位置类型
     * @return 是否符合要求
     */
    public static boolean isAdSlotTypeOK(int adSlotType, int positionType) {

        switch (adSlotType) {
            case AdUnitConstants.POSITION_TYPE.KAIPING:
                return isKaiPing(positionType);
            case AdUnitConstants.POSITION_TYPE.TIEPIAN:
                return isTiePian(positionType);
            case AdUnitConstants.POSITION_TYPE.TIEPIAN_MIDDLE:
                return isTiePianMiddle(positionType);
            case AdUnitConstants.POSITION_TYPE.TIEPIAN_PAUSE:
                return isTiePianPause(positionType);
            case AdUnitConstants.POSITION_TYPE.TIEPIAN_POST:
                return isTiePianPost(positionType);
            default:
                return false;
        }
    }

}
